﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using BLL;
using DataAccess;
using DevExpress.XtraEditors;
using DevExpress.XtraReports.UI;
using NLog;

namespace QuanLyKhachSan
{
    public partial class TabNhanVien : XtraUserControl,IGeneatetabName
    {
        private readonly NhanVienManager _manager;
        private NhanVien _nhanvien = new NhanVien();
        protected static Logger Logger = LogManager.GetCurrentClassLogger();

        public TabNhanVien()
        {
            InitializeComponent();
            _manager = new NhanVienManager();
        }

        public string Getname()
        {
            return "Nhân Viên";
        }

        private void LoadNhanVien()
        {
            List<NhanVien> list = _manager.LayDanhSach().Result;
            gridControlEmployee.DataSource = list;
        }

        private void TabNhanVien_Load(object sender, EventArgs e)
        {
            LoadNhanVien();
        }

        private void ThemNhanVien()
        {
            Logger.Info(Commons.ToString()+", chọn thao tác thêm nhân viên");
            var form = new FormNhanVienCapNhat(0);
            form.ShowDialog();
            if (form.Success)
            {
                XtraMessageBox.Show("Thêm thành công", "Thông báo", MessageBoxButtons.OK);
                _nhanvien = form.Nhanvien;
                LoadNhanVien();
            }
        }

        private void CapnhatNhanVien()
        {
            Logger.Info(Commons.ToString() + ", chọn thao tác cập nhật nhân viên");
            if (_nhanvien.MaNV == 0)
            {
                XtraMessageBox.Show("Vui lòng chọn nhân viên muốn cập nhật", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                try
                {
                    NhanVien nv = _nhanvien;
                    var form = new FormNhanVienCapNhat(1, nv);
                    form.ShowDialog();
                    if (form.Success)
                    {
                        XtraMessageBox.Show("Câp nhật thành công", "Thông báo", MessageBoxButtons.OK);
                        gridControlEmployee.RefreshDataSource();
                    }
                }
                catch
                {
                    XtraMessageBox.Show("Chọn nhân viên cập nhật", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
        }

        private void XoaNhanVien()
        {
            Logger.Info(Commons.ToString() + ", chọn thao tác xóa nhân viên");
            try
            {
                var nv = gridViewNhanVien.GetRow(gridViewNhanVien.GetSelectedRows()[0]) as NhanVien;
                var dia = XtraMessageBox.Show("Bạn chắc chắn muốn xóa nhân viên này", "Thông báo"
                    ,MessageBoxButtons.YesNo,MessageBoxIcon.Question);
                if (dia == DialogResult.Yes)
                {
                    var action = _manager.Xoa(nv);
                    if (action.Sucess())
                    {
                        XtraMessageBox.Show("Xóa thành công", "Thông báo", MessageBoxButtons.OK);
                        var listtk =
                            new TaiKhoanManager().LayDanhSach().Result.Where(tk => tk.MaNV.Equals(nv.MaNV)).ToList();
                        gridViewNhanVien.DeleteSelectedRows();
                        if (listtk.Count > 0)
                        {
                            for (int i = 0; i < listtk.Count; i++)
                                new TaiKhoanManager().Xoa(listtk[i]);
                        }
                    }
                    else
                        XtraMessageBox.Show(action.GetErrorMessage(),"Lỗi",MessageBoxButtons.OK);
                }
            }
            catch(Exception)
            {
            }
        }

        private void TimkiemNhanVien()
        {
            Logger.Info(Commons.ToString() + ", chọn thao tác tìm kiếm nhân viên");
            var form = new FormTimNhanVien();
            form.ShowDialog();
            if(form.Result.Any())
                gridControlEmployee.DataSource = form.Result;
        }

        private void btnThemNV_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            ThemNhanVien();
        }

        private void btnXoaNV_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            XoaNhanVien();
        }

        private void btnCapNhatNV_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            CapnhatNhanVien();
        }

        private void btnTimKiemNV_LinkClicked(object sender, DevExpress.XtraNavBar.NavBarLinkEventArgs e)
        {
            TimkiemNhanVien();
        }

        private void barButtonRefesh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            LoadNhanVien();
        }

        private void barButtonItemTimKiem_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            gridViewNhanVien.OptionsFind.AlwaysVisible = !gridViewNhanVien.OptionsFind.AlwaysVisible;
        }

        private void barButtonItemcapnhat_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            CapnhatNhanVien();
        }

        private void barButtonItemXoa_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            XoaNhanVien();
        }

        private void barButtonItemThem_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ThemNhanVien();
        }

        private void gridControlEmployee_Click(object sender, EventArgs e)
        {
            try
            {
                _nhanvien = gridViewNhanVien.GetRow(gridViewNhanVien.GetSelectedRows()[0]) as NhanVien;
            }
            catch
            {
                XtraMessageBox.Show("Chưa chọn được nhân viên");
            }
        }

        private void gridViewNhanVien_RowUpdated(object sender, DevExpress.XtraGrid.Views.Base.RowObjectEventArgs e)
        {
            Logger.Info(Commons.ToString() + ", chọn thao tác cập nhật trên dòng đang chọn");
            var nv = gridViewNhanVien.GetRow(gridViewNhanVien.GetSelectedRows()[0]) as NhanVien;
            if (nv == null)
            {
                XtraMessageBox.Show("Chưa chọn nhân viên", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                var action = _manager.CapNhat(nv);
                if (action.Sucess())
                {
                    XtraMessageBox.Show("Cập nhật thành công", "Thông báo", MessageBoxButtons.OK);
                }
                else
                {
                    XtraMessageBox.Show(action.GetErrorMessage(), "Lỗi", MessageBoxButtons.OK);
                    Logs(action);
                }
            }
        }

        private void thêmToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ThemNhanVien();
        }

        private void xóaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            XoaNhanVien();
        }

        private void cậpNhậtToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CapnhatNhanVien();
        }

        private void tìmKiếmToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TimkiemNhanVien();
        }

        private void btnprintsPDF_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Logger.Info(Commons.ToString() + ", Chọn thao tác in danh sách nhân viên");
            var list = new List<NhanVien>();
            for(int i = 0;i<gridViewNhanVien.RowCount;i++)
                list.Add(gridViewNhanVien.GetRow(i) as NhanVien);
            if (list.Count == 0)
            {
                XtraMessageBox.Show("Chưa có dữ liệu, không thể thực hiện in danh sách nhân viên", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Logger.Error("Chưa có dữ liệu, không thể thực hiện in danh sách nhân viên");
            }
            else
            {
                var xtra = new XtraReportNhanVien(list);
                xtra.CreateDocument();
                xtra.ShowPreview();
            }
        }

        private static void Logs(ActionResult listResult)
        {
            foreach (var ex in listResult.Exceptions)
            {
                Logger.Error(ex.Message);
            }
        } 
    }
}
